package es.cea.chat;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

@Test
public class TestArranca {

	EntityManagerFactory emf;
	@BeforeTest
	public void arranca(){
		
		emf = Persistence.createEntityManagerFactory("manager1");
	}

	@Test
	public void pruebaArranque(){
		
		 EntityManager em = emf.createEntityManager(); // Retrieve an application managed entity manager
		
		List<Mensaje> resultList = em.createQuery("from Mensaje").getResultList();
		int tamanyo=resultList.size();

		System.out.println(tamanyo);
		
		em.close();
	}

	@Test
	public void insertarMensaje(){
		
		EntityManager em = emf.createEntityManager(); // Retrieve an application managed entity manager
		
		
		List<Mensaje> resultList = em.createQuery("from Mensaje").getResultList();
		int tamanyo=resultList.size();
		tamanyo=resultList.size();
		System.out.println(tamanyo);
		assert(tamanyo==2);
		
		
		EntityTransaction tx = em.getTransaction();
		tx.begin();
		Mensaje mensaje = new Mensaje();
		Usuario usuario = em.find(Usuario.class, new Long(1));
		Chat chat = em.find(Chat.class, new Long(1));
		
		mensaje.setUsuario(usuario);
		mensaje.setTexto("Insertado desde test");
		mensaje.setChat(chat);
		em.persist(mensaje);
		tx.commit();
		
		resultList = em.createQuery("from Mensaje").getResultList();
		tamanyo=resultList.size();
		System.out.println(tamanyo);
		assert(tamanyo==3);
		
		em.close();
	}
	
	@Test
	public void borrarMensaje(){
		EntityManager em = emf.createEntityManager(); // Retrieve an application managed entity manager
		
		List<Mensaje> resultList = em.createQuery("from Mensaje").getResultList();
		int tamanyo=resultList.size();
		tamanyo=resultList.size();
		assert(tamanyo==3);
		
		EntityTransaction tx = em.getTransaction();
		tx.begin();
		Mensaje mensaje = resultList.get(1);
		em.remove(mensaje);
		tx.commit();
		resultList = em.createQuery("from Mensaje").getResultList();
		tamanyo=resultList.size();
		assert(tamanyo==2);
	}
	
	@Test
	public void usuarioNuevo(){
		EntityManager em = emf.createEntityManager(); 
		
		Color color = em.find(Color.class, new Long(2));
		
		System.out.println(color.getNombre());
//		Query createQuery = em.createQuery("from Usuario usuarioAlias where usuarioAlias.color =?");
		Query createQuery = em.createQuery("from Color c where c.nombre =?");
		createQuery.setParameter(1, color.getNombre());
		List<Color> resultList = createQuery.getResultList();
		int tamanyo=resultList.size();
		System.out.println(tamanyo);
		Color color2 = resultList.get(0);
		assert(tamanyo==1 && color2.getUsuarios().size() == 1);
		
		
		EntityTransaction tx = em.getTransaction();
		tx.begin();
		Usuario usuario = new Usuario();
		usuario.setNombre("Nuevo usuario creado test");
		usuario.setColor(color);
		em.persist(usuario);
		tx.commit();
		tx = em.getTransaction();
		tx.begin();

//		em.createQuery("from Color c where c.nombre =?");
//		createQuery.setParameter(1, color.getNombre());
		Color colorModificado = em.find(Color.class, new Long(2));
		em.refresh(colorModificado);
		System.out.println(colorModificado.getNombre());
		tamanyo = colorModificado.getUsuarios().size();
		System.out.println(colorModificado.getUsuarios().size());
		assert(tamanyo==2): "tamanyo: "+colorModificado.getNombre()+tamanyo;
		tx.commit();

		em.close();
		emf.close(); //close at application end
	}

}
